#include <time.h>

#define MINUTE 60
#define HOUR (60 * MINUTE)
#define DAY (24 * HOUR)
#define YEAR (365 * DAY)

// 假设是闰年
static int month[12] = {
    0,
    DAY * (31),
    DAY * (31 + 29),
    DAY * (31 + 29 + 31),
    DAY * (31 + 29 + 31 + 30),
    DAY * (31 + 29 + 31 + 30 + 31),
    DAY * (31 + 29 + 31 + 30 + 31 + 30),
    DAY * (31 + 29 + 31 + 30 + 31 + 30 + 31),
    DAY * (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31),
    DAY * (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30),
    DAY * (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31),
    DAY * (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30)
};

// 返回从1970年1月1日0时到开机经过的秒数作为开机时间
long kernel_mktime(struct tm *tm)
{
    long res;
    int year;

    year = tm->tm_year - 70;    // 从1970年到现在经过的年数
    // 为了获得正确地闰年数，需要使用year+1
    res = YEAR * year + DAY * ((year + 1) / 4);    // 每有一个闰年多加一天
    res += month[tm->tm_mon];
    // 如果是3月或以上，而且不是闰年，需要调整时间
    if (tm->tm_mon > 1 && ((year + 2) % 4))
        res -= DAY;
    res += DAY * (tm->tm_mday - 1);
    res += HOUR * tm->tm_hour;
    res += MINUTE * tm->tm_min;
    res += tm->tm_sec;
    return res;
}
